package proyecto.ort.edu.uy.web.presentacion;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.primefaces.context.RequestContext;
import org.primefaces.model.TreeNode;

import proyecto.ort.edu.uy.dao.TareaDAOInterface;
import proyecto.ort.edu.uy.dominio.Estado;
import proyecto.ort.edu.uy.dominio.EstadosTarea;
import proyecto.ort.edu.uy.dominio.Nota;
import proyecto.ort.edu.uy.dominio.Tarea;
import proyecto.ort.edu.uy.dominio.Usuario;
import proyecto.ort.edu.uy.manager.EstadoManagerLocal;
import proyecto.ort.edu.uy.manager.EstadoTareaManagerLocal;
import proyecto.ort.edu.uy.manager.NotaManagerLocal;
import proyecto.ort.edu.uy.manager.TareaManagerLocal;
import proyecto.ort.edu.uy.web.utilidades.EnumParametros;

@SessionScoped
@ManagedBean(name = "etBean")
public class EstadoTareaBean extends AbstractBaseBean {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1993842074537244877L;

	private Usuario usuarioSession;
	private Tarea selectedTarea;
	// Proximos estados
	private boolean estadoNoAsignada = false;
	private boolean estadoAsignada = false;
	private boolean estadoTomada = false;
	private boolean estadoRechazada = false;
	private boolean estadoCancelada = false;
	private boolean estadoReasignada = false;
	private boolean estadoSuspendida = false;
	private boolean estadoIniciada = false;
	private boolean estadoFinalizada = false;
	private boolean modificarTarea = false;
	private boolean ingresarNota = true;
	private boolean tareaHija = false;
	private String strfv;
	private String textoNota;
	private Nota notaPadre;	
	private Tarea tareaPadre;
	private Integer duracionTarea;
	private boolean duracion = false;
	
	public Integer getDuracionTarea() {
		return duracionTarea;
	}

	public void setDuracionTarea(Integer duracionTarea) {
		this.duracionTarea = duracionTarea;
	}

	public Tarea getTareaPadre() {
		return tareaPadre;
	}

	public void setTareaPadre(Tarea tareaPadre) {
		this.tareaPadre = tareaPadre;
	}

	@EJB
	private NotaManagerLocal notasBean;

	@EJB
	private EstadoManagerLocal estadoBean;

	@EJB
	private EstadoTareaManagerLocal estadoTareaBean;

	@EJB
	private TareaManagerLocal tareaBean;

	public EstadoTareaBean() {
		// TODO Auto-generated constructor stub
	}

	@PostConstruct
	public void loadSessionData() {
		this.setUsuarioSession(super.userLogin());
		// this.setSelectedTarea(super.obtenerTareaSeleccionada());
	}

	public Tarea getSelectedTarea() {
		return selectedTarea;
	}

	public void setSelectedTarea(Tarea selectedTarea) {
		this.selectedTarea = selectedTarea;
	}

	public Usuario getUsuarioSession() {
		return usuarioSession;
	}

	public void setUsuarioSession(Usuario usuarioSession) {
		this.usuarioSession = usuarioSession;
	}

	public String cargarPagina() {
		String outcome = "/paginas/estadoTareaForm";
		this.proximosEstados();
		this.Convertstrfv();
		return outcome;
	}

	public void Convertstrfv() {
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		if (selectedTarea.getFechaVencimiento() == null) {
			strfv = "No tiene";
		} else {
			strfv = sdf.format(selectedTarea.getFechaVencimiento());
		}
	}

	// Esta funcion pone en true los boolean para los siguientes estados.
	public void proximosEstados() {
		this.estadoAsignada = false;
		this.estadoCancelada = false;
		this.estadoFinalizada = false;
		this.estadoIniciada = false;
		this.estadoNoAsignada = false;
		this.estadoReasignada = false;
		this.estadoRechazada = false;
		this.estadoSuspendida = false;
		this.estadoTomada = false;
		this.modificarTarea = false;
		this.ingresarNota = true;
		this.duracion = false;
		this.setTareaHija(false);
		boolean usuarioCreador = false;
		boolean usuarioAsignado = false;
		if (usuarioSession.getUsername().equals(selectedTarea.getUsuarioCreador().getUsername())) {
			usuarioCreador = true;			
		}
		for (Usuario asignado : selectedTarea.getLstUsuariosAsignados()) {
			if (asignado.getUsername().equals(usuarioSession.getUsername())) {
				usuarioAsignado = true;				
			}
		}
		Long estadoActual = this.selectedTarea.getUltimoEstado().getEstado().getIdEstado();
		if (estadoActual.equals(Long.valueOf(EnumParametros.ESTADO_NO_ASIGNADO.valor))) {
			this.estadoAsignada = true;
			this.estadoCancelada = true;			
			this.modificarTarea = true;
		}
		if (estadoActual.equals(Long.valueOf(EnumParametros.ESTADO_ASIGNADA.valor))) {
			if (usuarioCreador) {
				this.estadoCancelada = true;			
				this.modificarTarea = true;
			}
			if (usuarioAsignado) {
				this.estadoIniciada = true;
				this.estadoRechazada = true;
				if (usuarioSession.getNivelUsuario().getValor() <= 40000) {
					this.tareaHija = true;			
					this.modificarTarea = true;
				}				
			}
		}
		if (estadoActual.equals(Long.valueOf(EnumParametros.ESTADO_RECHAZADA.valor))) {
			if (usuarioCreador) {
				this.estadoReasignada = true;
				this.estadoCancelada = true;
			
				this.modificarTarea = true;
			}
		}
		if (estadoActual.equals(Long.valueOf(EnumParametros.ESTADO_INICIADA.valor))) {
			this.estadoFinalizada = true;
						
			if (usuarioAsignado) {
				this.estadoSuspendida = true;				
			}
		}
		if (estadoActual.equals(Long.valueOf(EnumParametros.ESTADO_SUSPENDIDA.valor))) {
			if (usuarioCreador) {
				this.estadoCancelada = true;
				
				this.modificarTarea = true;
			}
			if (usuarioAsignado) {
				this.estadoIniciada = true;
								
			}
		}
		if (estadoActual.equals(Long.valueOf(EnumParametros.ESTADO_REASIGNADA.valor))) {
			if (usuarioAsignado) {
				this.estadoIniciada = true;
				this.estadoRechazada = true;
								
			}
			if (usuarioCreador) {
				this.estadoCancelada = true;
				
				this.modificarTarea = true;
			}
		}
		if (estadoActual.equals(Long.valueOf(EnumParametros.ESTADO_TOMADA.valor))) {
			if (usuarioAsignado) {
				this.estadoIniciada = true;
				this.estadoRechazada = true;
				
				
			}
			if (usuarioCreador) {
				this.estadoCancelada = true;				
				this.modificarTarea = true;
			}
		}		
		if (estadoActual.equals(Long.valueOf(EnumParametros.ESTADO_FINALIZADA.valor))) {
			this.duracion = true;
			this.ingresarNota = false;
			this.modificarTarea = false;
		}
	}

	public boolean getEstadoNoAsignada() {
		return estadoNoAsignada;
	}

	public void setEstadoNoAsignada(boolean estadoNoAsignada) {
		this.estadoNoAsignada = estadoNoAsignada;
	}

	public boolean getEstadoAsignada() {
		return estadoAsignada;
	}

	public void setEstadoAsignada(boolean estadoAsignada) {
		this.estadoAsignada = estadoAsignada;
	}

	public boolean getEstadoTomada() {
		return estadoTomada;
	}

	public void setEstadoTomada(boolean estadoTomada) {
		this.estadoTomada = estadoTomada;
	}

	public boolean getEstadoRechazada() {
		return estadoRechazada;
	}

	public void setEstadoRechazada(boolean estadoRechazada) {
		this.estadoRechazada = estadoRechazada;
	}

	public boolean getEstadoCancelada() {
		return estadoCancelada;
	}

	public void setEstadoCancelada(boolean estadoCancelada) {
		this.estadoCancelada = estadoCancelada;
	}

	public boolean getEstadoReasignada() {
		return estadoReasignada;
	}

	public void setEstadoReasignada(boolean estadoReasignada) {
		this.estadoReasignada = estadoReasignada;
	}

	public boolean getEstadoSuspendida() {
		return estadoSuspendida;
	}

	public void setEstadoSuspendida(boolean estadoSuspendida) {
		this.estadoSuspendida = estadoSuspendida;
	}

	public boolean getEstadoIniciada() {
		return estadoIniciada;
	}

	public void setEstadoIniciada(boolean estadoIniciada) {
		this.estadoIniciada = estadoIniciada;
	}

	public boolean getEstadoFinalizada() {
		return estadoFinalizada;
	}

	public void setEstadoFinalizada(boolean estadoFinalizada) {
		this.estadoFinalizada = estadoFinalizada;
	}

	public String getStrfv() {
		return strfv;
	}

	public void setStrfv(String strfv) {
		this.strfv = strfv;
	}

	public String getTextoNota() {
		return textoNota;
	}

	public void setTextoNota(String texto) {
		this.textoNota = texto;
	}

	public void guardarTextoNota() {
		if (textoNota != null && !textoNota.isEmpty()) {
			if (this.selectedTarea != null) {
				Nota nota = new Nota();
				nota.setAutor(this.usuarioSession);
				nota.setDescripcion(textoNota);
				nota.setTarea(selectedTarea);
				Date fecha = new Date();
				nota.setFechaCreacion(fecha);
				//this.guardarNota(nota);
				selectedTarea.getLstNotas().add(nota);
				tareaBean.actualizarTarea(selectedTarea);
				textoNota = new String();				
			}
		}
	}

	public void rechazarTarea() {
		tareaPadre = null;
		Estado estado = estadoBean.obtenerEstadoPorId(Long.parseLong(EnumParametros.ESTADO_RECHAZADA.valor));
		cambiarEstado(estado);
		guardarTextoNota();
	}

	private void guardarNota(Nota note) {
		notasBean.guardarNota(note);		
	}

	public Nota getNotaPadre() {
		return notaPadre;
	}

	public void setNotaPadre(Nota notaPadre) {

		this.notaPadre = notaPadre;
	}

	public void iniciarTarea() {
		tareaPadre = null;
		Estado estado = estadoBean.obtenerEstadoPorId(Long.parseLong(EnumParametros.ESTADO_INICIADA.valor));
		cambiarEstado(estado);
	}

	public void suspenderTarea() {
		tareaPadre = null;
		Estado estado = estadoBean.obtenerEstadoPorId(Long.parseLong(EnumParametros.ESTADO_SUSPENDIDA.valor));
		cambiarEstado(estado);
	}

	public void finalizarTarea() {
		tareaPadre = null;
		Estado estado = estadoBean.obtenerEstadoPorId(Long.parseLong(EnumParametros.ESTADO_FINALIZADA.valor));
		cambiarEstado(estado);
		Date hoy = new Date();
		this.selectedTarea.setFechaFinalizacion(hoy);
		if(duracionTarea != null){
			this.selectedTarea.setDuracionRealizada(duracionTarea);
		}
		tareaBean.actualizarTarea(selectedTarea);
	}

	private void cambiarEstado(Estado estado) {

		Date fecha = new Date();
		if (estado != null) {
			EstadosTarea estadoTarea = new EstadosTarea();
			estadoTarea.setEstado(estado);
			estadoTarea.setFecha(fecha);
			estadoTarea.setUsuario(usuarioSession);
			estadoTarea.setTarea(selectedTarea);
			if (selectedTarea.getLstEstados() != null) {
				selectedTarea.getLstEstados().add(estadoTarea);
			} else {
				List<EstadosTarea> lstEstados = new ArrayList<EstadosTarea>();
				lstEstados.add(estadoTarea);
				selectedTarea.setLstEstados(lstEstados);
			}
			this.estadoTareaBean.guardarEstadoTarea(estadoTarea);
			this.proximosEstados();

		}
		// areaBean.CargarTareasTodas();
	}

	public void cancelarTarea() {
		tareaPadre = null;
		Estado estado = estadoBean.obtenerEstadoPorId(Long.parseLong(EnumParametros.ESTADO_CANCELADA.valor));
		cambiarEstado(estado);
	}

	public boolean getTareaHija() {
		return tareaHija;
	}

	public void setTareaHija(boolean tareaHija) {
		this.tareaHija = tareaHija;
	}

	public List<Nota> getlistarNotas() {
		List<Nota> notas;
		if (selectedTarea != null) {
			if (selectedTarea.getLstNotas() == null) {
				notas = new ArrayList<Nota>();
			} else {
				notas = selectedTarea.getLstNotas();
			}
		} else {
			notas = new ArrayList<Nota>();
		}
		return notas;
	}

	public boolean getModificarTarea() {
		return modificarTarea;
	}

	public void setModificarTarea(boolean modificarTarea) {
		this.modificarTarea = modificarTarea;
	}

	public boolean getIngresarNota() {
		return ingresarNota;
	}

	public void setIngresarNota(boolean ingresarNota) {
		this.ingresarNota = ingresarNota;
	}

	public boolean getDuracion() {
		return duracion;
	}

	public void setDuracion(boolean duracion) {
		this.duracion = duracion;
	}

	
}
